"""
日志工具模块，提供统一的日志记录功能
"""
import os
import sys
from loguru import logger

# 预置模块常量定义
MODULE_SCAN = "扫货模块"
MODULE_SELECT = "选品模块"
MODULE_REFRESH = "账号刷新模块"
MODULE_LOGIN = "登录模块"
MODULE_TASK = "任务模块"
MODULE_MAIN = "主程序"
MODULE_DB = "数据库模块"
MODULE_ACCOUNT_POOL = "账号池"

class LogConfig:
    """日志配置类"""
    
    def __init__(self):
        # 先移除默认的日志处理器
        logger.remove()
        
        try:
            # 判断是否是打包后的exe运行
            if getattr(sys, 'frozen', False):
                # 如果是exe运行，使用exe所在目录
                base_path = os.path.dirname(sys.executable)
            else:
                # 如果是开发环境，使用项目根目录
                base_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
                
            # 日志文件保存路径
            self.log_path = os.path.join(base_path, "logs")
            
            # 创建日志目录
            if not os.path.exists(self.log_path):
                os.makedirs(self.log_path)
            
            # 添加文件输出处理器
            logger.add(
                os.path.join(self.log_path, "app_{time:YYYY-MM-DD}.log"),
                rotation="00:00",  # 每天午夜轮转
                retention="30 days",  # 保留30天
                compression=lambda f: f + '.zip',  # 自定义压缩文件名格式
                encoding="utf-8",
                level="DEBUG",
                format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | 模块:{extra[module]} | {name}:{function}:{line} | {message}",
                delay=False  # 立即创建文件
            )
            
            # 如果不是打包后的exe或者没有使用--windowed选项，添加控制台输出
            if not getattr(sys, 'frozen', False) or sys.stderr is not None:
                logger.add(
                    sys.stderr,
                    format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
                           "<level>{level: <8}</level> | "
                           "模块:<cyan>{extra[module]}</cyan> | "
                           "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> | "
                           "{message}",
                    level="INFO"
                )
            
        except Exception as e:
            # 如果文件日志初始化失败，尝试只使用控制台
            if not getattr(sys, 'frozen', False) or sys.stderr is not None:
                logger.add(
                    sys.stderr,
                    format="<red>ERROR</red> | {message}",
                    level="ERROR"
                )
                logger.error(f"日志初始化失败: {str(e)}")

# 创建日志配置实例
log_config = LogConfig()

def get_logger(module: str = None):
    """获取logger实例
    
    Args:
        module: 模块名称，用于标识日志来源
        
    Returns:
        logger实例
    """
    return logger.bind(module=module if module else "system")

# 导出logger供其他模块使用
# 使用示例
if __name__ == "__main__":
    # 获取logger
    log = get_logger(__name__)
    
    # 测试各个日志级别
    log.debug("这是一条调试信息")
    log.info("这是一条普通信息")
    log.warning("这是一条警告信息")
    log.error("这是一条错误信息")
    
    # 测试异常记录
    try:
        1/0
    except Exception as e:
        log.exception("发生异常：")
        
    # 测试结构化日志
    log.info("用户操作", user="admin", action="login", status="success")
